package 算法.leetcode.offer;

import java.util.Arrays;

/**
 * @author lchenglong
 * @date 2022/4/27
 */
public class Offer60 {

    public static void main(String[] args) {
        Offer60 instance = new Offer60();
        double[] ans = instance.dicesProbability(2);
        System.out.println(Arrays.toString(ans));
    }
    public double[] dicesProbability(int n) {
        // 1个骰子，出现的概率
        // 因为我们最后只需要最后一个数组即可,所以不用定义二维数组
        double[] dp = new double[6];
        Arrays.fill(dp,1.0/6.0);

        // 第2个以后的情况处理
        for (int i=2;i<=n;i++) {
            // 每次的点数之和范围会有点变化，点数之和的值最大是i*6，最小是i*1，i之前的结果值是不会出现的；
            // 点数之和为 6 * i- (i-1) = 5*i+1
            double[] tmp = new double[5 * i +1];
            for (int j = 0;j< dp.length;j++) {
                // 比如只有1个骰子时，dp[1]是代表当骰子点数之和为2时的概率，它会对当有2个骰子时的点数之和为3、4、5、6、7、8产生影响，
                // 因为当有一个骰子的值为2时，另一个骰子的值可以为1~6，产生的点数之和相应的就是3~8；
                // 比如dp[2]代表点数之和为3，它会对有2个骰子时的点数之和为4、5、6、7、8、9产生影响；
                // 所以k在这里就是对应着第i个骰子出现时可能出现六种情况
                for (int k=0;k<6;k++){
                    tmp[j+k]+= dp[j]/6.0;
                }
            }
            // 第i个骰子的点数之和计算出来之后,供第i+1个骰子使用
            dp = tmp;
        }
        return dp;
    }
}
